#ifndef __FILE_MANAGER_H__
#define __FILE_MANAGER_H__

#include <iostream>
#include <fstream>
#include <sys/stat.h> // struct stat
#include <boost/filesystem.hpp>
#include <jsoncpp/json/json.h>
#include <yaml-cpp/yaml.h>

// https://theboostcpplibraries.com/boost.filesystem
// https://www.boost.org/doc/libs/1_85_0/libs/filesystem/doc/reference.html
namespace fs = boost::filesystem;
using namespace std;

struct FileInfo{
    bool is_file = false;           //是否是常规文件
    bool is_dir = false;            //是否是目录
    bool is_exists = false;         //文件是否存在
    string file_name = "";          //文件名称
    string file_path = "";          //文件路径
    string file_name_no_suffix = "";//文件名称(不带后缀)
    string suffix = "";             //文件后缀
    size_t file_size = 0;           //文件尺寸，单位字节
    time_t c_time = 0;              //创建时间
    time_t m_time = 0;              //编辑时间
};

// 文件操作
namespace file_manager{
    /***********************************************************
     * 文件操作
     ***********************************************************/
    // 文件创建
    bool CreateFile(string file_path);
    // 文件删除
    bool DeleteFile(string file_path);
    // 文件复制
    bool CopyFile(string old_file_path, string new_file_path);      
    // 文件大小 单位M
    float GetFileSize(string file_path);
    // 文件移动到指定文件夹
    bool MoveFileToDir(string old_file_path, string dir_path);   
    // 是否是文件判断
    bool IsFile(string file_path);

    /***********************************************************
     * 文件/文件夹通用操作
     ***********************************************************/
    // 文件/文件夹是否存在
    bool IsExists(string file_path);
    // 文件/文件夹创建时间
    time_t GetCreateTime(string file_path);
    // 文件/文件夹修改时间
    time_t GetModifyTime(string file_path);
    // 文件/文件夹信息
    FileInfo GetInfo(string file_path);
    // 文件/文件夹重命名
    bool Rename(string old_file_path, string new_file_path);

    /***********************************************************
     * 文件夹操作
     ***********************************************************/
    // 文件夹创建
    bool CreateDir(string dir_path);
    // 文件夹删除
    bool DeleteDir(string dir_path);
    // 递归复制目录文件
    void copy_directory_recursive(const fs::path& source, const fs::path& target);
    // 文件夹复制
    bool CopyDir(string old_dir_path, string new_dir_path);
    // 文件夹大小 单位M
    float GetDirSize(string dir_path);
    // 文件夹移动到指定文件夹
    bool MoveDirToDir(string old_dir_path, string dir_path);
    // 是否是文件夹
    bool IsDir(string dir_path);
    // 获取文件列表 0 - 仅包含文件 1 - 仅包含文件夹 2 - 包含文件和文件夹
    vector<string> ListDirWithDepth1(string dir_path, int cmd);

    /***********************************************************
     * Ymal文件读写
     ***********************************************************/
    // 处理带双引号的字符串读取异常导致写入也异常问题
    // * data_en: " "  -> data_en: !<!> " "  -> data_en: " "
    void ReplaceString(YAML::Node& node);
    // Ymal文件写入
    bool WriteYamlFile(string file_path, YAML::Node& config);
    // Ymal文件读取
    YAML::Node ReadYamlFile(string file_path);

    /***********************************************************
     * Json文件读写
     ***********************************************************/
    // Json文件写入
    bool WriteJsonFile(string file_path, Json::Value& root);
    // Json文件读取
    Json::Value ReadJsonFile(string file_path);
    // 检测Json字段是否有效
    bool CheckItemIsValid(Json::Value& json_data, string item);

}; // namespace file_manager

#endif

